package com.zeng.stpro.modules.security.utils;

/**
 * SpringSecurity 工具类
 *
 * 1)可以直接注入 public Authentication getUser(Authentication authentication){ return authentication;}
 * {
 *     authorities[
 *          {
 *              authority: admin
 *          }
 *     ]
 *     details: {
 *          romoteAddiress: "0:0:0:0:0:0:0:1",
 *          sessionId: null
 *     }
 *     authenticated: true,
 *     principal: { // 即注入 @AuthenticationPrincipal UserDetails userDetails 即部分
 *         password:
 *         username:
 *         authorities:{
 *             authority: admin
 *         },
 *         accountNonExpired: true,
 *         accountNonLocked: true,
 *         credentialsNonExpired: true
 *     },
 *     credentials: null,
 *     name: admin
 * }
 *
 * 2)或者直接注入 public UserDetails xxMethod(@AuthenticationPrincipal UserDetails userDetails){return userDetails;} 方式
 *
 */

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.security.Principal;

/**
 * @ClassName SecurityUtils
 * @Description TODO
 * @Author zhijun zeng at 23:41 2021/2/3
 * @Version 1.0
 **/
public class SecurityUtils {

    /**
     * 获取 Authentication 认证对象
     * @return
     */
    public static Authentication getAuthentication() {
        return SecurityContextHolder.getContext().getAuthentication();
    }

    /**
     * 获取 Principal 认证用户名
     * @return
     */
    public static String getPrincipal() {
        Authentication authentication = getAuthentication();
        if (authentication != null) {
            return  (String) getAuthentication().getPrincipal();
        }
        return null;
    }

    /**
     * 获取 Principal 认证用户, 使用时需要向 用户 转型
     * @return
     */
    public static Object getPrincipalObject() {
        Authentication authentication = getAuthentication();
        if (authentication != null) {
            return  getAuthentication().getPrincipal();
        }
        return null;
    }

    /**
     * 获取到登录用户
     * @return
     */
    public static String getUsername() {
//        String user = (String) getPrincipalObject();
//        if (user != null) {
//            return user;
//        }
//        return null;
        return getPrincipal();
    }

    /**
     * 加密密码
     *
     * 加密(encode)：注册用户时, 使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理, 得到密码的hash值, 然后将其存入数据库中
     *
     * @param password
     * @return
     */
    public static String encode(String password) {
        return new BCryptPasswordEncoder().encode(password);
    }

    /**
     * 比较密码
     *
     * 密码匹配(matches)：用户登录时, 密码匹配阶段并没有进行密码解密（因为密码经过Hash处理, 是不可逆的）,
     * 而是使用相同的算法把用户输入的密码进行hash处理, 得到密码的hash值, 然后将其与从数据库中查询到的密码hash值进行比较.
     * 如果两者相同, 说明用户输入的密码正确.
     *
     * @param inputPassword  用户输入密码
     * @param originPassword 用户数据库密码
     * @return
     */
    public static boolean matches(String inputPassword, String originPassword) {
        return new BCryptPasswordEncoder().matches(inputPassword, originPassword);
    }

    public static void main(String[] args) {
        System.out.println(SecurityUtils.encode("admin"));
    }

}
